// 导入wxCharts图表库
let wxCharts = null;
try {
  wxCharts = require('../../../utils/wxcharts.js');
} catch (importError) {
  console.error('导入wxCharts库失败:', importError);
  // 重构兼容层：用Class模拟wxCharts实例，确保destroy方法存在
  wxCharts = class {
    constructor(config) {
      console.warn('使用wxCharts兼容层（模拟实例），配置:', config);
      this._canvasId = config?.canvasId || 'healthChart';
      this._destroyed = false;
    }
    // 模拟destroy方法，避免类型错误
    destroy() {
      this._destroyed = true;
      console.warn(`兼容层：销毁${this._canvasId}图表实例`);
    }
    // 模拟getCurrentDataIndex方法（空实现，避免点击报错）
    getCurrentDataIndex() {
      return { index: -1, seriesIndex: -1 };
    }
  };
}

Page({
  data: {
    // 时间范围状态
    currentTimeRange: 'week', // week, month, year
    currentDate: '',
    
    // 健康评分数据
    healthScore: 85,
    healthScoreDescription: '牙齿健康状况良好，继续保持！',
    trendValue: 3,
    trendDirection: 'up', // up, down, same
    
    // 图表类型
    currentChart: 'overall', // overall, detailed
    
    // 图表加载状态
    chartLoading: false,
    
    // 图表实例
    chartInstance: null,
    
    // 关键指标数据
    metricsList: [],
    
    // 健康建议数据
    suggestionsList: []
  },

  onLoad: function() {
    try {
      // 初始化日期显示
      this.setCurrentDate();
      
      // 初始化数据
      this.initData();
      
      // 渲染图表
      this.renderChart();
      
    } catch (error) {
      console.error('页面加载初始化失败:', error);
      wx.showToast({ title: '初始化失败', icon: 'none' });
    }
  },

  // 设置当前日期显示
  setCurrentDate: function() {
    const now = new Date();
    const year = now.getFullYear();
    const month = now.getMonth() + 1;
    const day = now.getDate();
    const currentDate = `${year}年${month}月${day}日`;
    this.setData({ currentDate });
  },

  // 初始化页面数据
  initData: function() {
    // 根据当前时间范围获取数据
    const { currentTimeRange } = this.data;
    
    // 初始化关键指标数据
    const metricsList = this.getMetricsData(currentTimeRange);
    
    // 初始化健康建议数据
    const suggestionsList = this.getSuggestionsData();
    
    this.setData({
      metricsList,
      suggestionsList
    });
  },

  // 获取关键指标数据
  getMetricsData: function(timeRange) {
    // 根据时间范围返回不同的模拟数据
    const baseData = [
      {
        id: '1',
        title: '刷牙频率',
        value: '2.5次/天',
        status: 'good',
        statusText: '良好',
        change: 5
      },
      {
        id: '2',
        title: '口腔pH值',
        value: '6.8',
        status: 'normal',
        statusText: '正常',
        change: -2
      },
      {
        id: '3',
        title: '牙龈健康',
        value: '92%',
        status: 'good',
        statusText: '良好',
        change: 3
      },
      {
        id: '4',
        title: '牙结石',
        value: '少量',
        status: 'normal',
        statusText: '正常',
        change: -5
      }
    ];
    
    // 根据时间范围调整一些数据，模拟不同时间段的数据变化
    if (timeRange === 'month') {
      return baseData.map(item => ({
        ...item,
        change: Math.round(item.change * 0.8)
      }));
    } else if (timeRange === 'year') {
      return baseData.map(item => ({
        ...item,
        change: Math.round(item.change * 2),
        value: item.id === '1' ? '2.8次/天' : item.id === '2' ? '7.0' : item.value
      }));
    }
    
    return baseData;
  },

  // 获取健康建议数据
  getSuggestionsData: function() {
    return [
      {
        id: '1',
        icon: '🦷',
        title: '保持正确刷牙方式',
        description: '建议使用巴氏刷牙法，每次刷牙时间不少于2分钟，每天早晚各一次。'
      },
      {
        id: '2',
        icon: '💧',
        title: '注意口腔保湿',
        description: '多喝水保持口腔湿润，有助于减少细菌滋生和口臭问题。'
      },
      {
        id: '3',
        icon: '🥗',
        title: '合理饮食',
        description: '减少甜食摄入，多吃富含纤维的食物，有助于清洁牙齿和按摩牙龈。'
      },
      {
        id: '4',
        icon: '🩺',
        title: '定期检查',
        description: '每6个月进行一次口腔检查和洗牙，及时发现和处理口腔问题。'
      }
    ];
  },

  // 切换时间范围
  switchTimeRange: function(e) {
    try {
      const range = e.currentTarget.dataset.range;
      if (range === this.data.currentTimeRange) return;
      
      this.setData({ currentTimeRange: range }, () => {
        // 更新数据
        this.initData();
        // 更新健康评分（模拟不同时间范围的评分变化）
        this.updateHealthScore(range);
        // 延迟一点时间再渲染，确保数据更新完成
        setTimeout(() => {
          this.renderChart();
        }, 100);
      });
    } catch (error) {
      console.error('切换时间范围失败:', error);
      wx.showToast({ title: '切换失败', icon: 'none' });
    }
  },

  // 更新健康评分
  updateHealthScore: function(timeRange) {
    let healthScore, trendValue, trendDirection, description;
    
    switch(timeRange) {
      case 'week':
        healthScore = 85;
        trendValue = 3;
        trendDirection = 'up';
        description = '牙齿健康状况良好，继续保持！';
        break;
      case 'month':
        healthScore = 82;
        trendValue = 1;
        trendDirection = 'up';
        description = '月度健康状况稳定，有小幅提升。';
        break;
      case 'year':
        healthScore = 78;
        trendValue = 5;
        trendDirection = 'up';
        description = '年度健康状况有明显改善，继续坚持良好习惯。';
        break;
    }
    
    this.setData({
      healthScore,
      trendValue,
      trendDirection,
      healthScoreDescription: description
    });
  },

  // 切换图表类型
  switchChart: function(e) {
    try {
      const chartType = e.currentTarget.dataset.chart;
      if (chartType === this.data.currentChart) return;
      
      this.setData({ currentChart: chartType }, () => {
        // 延迟一点时间再渲染，确保数据更新完成
        setTimeout(() => {
          this.renderChart();
        }, 100);
      });
    } catch (error) {
      console.error('切换图表类型失败:', error);
      wx.showToast({ title: '切换失败', icon: 'none' });
    }
  },

  // 渲染图表
  renderChart: function() {
    try {
      // 设置加载状态
      this.setData({ chartLoading: true });
      
      // 确保wxCharts存在且为构造函数
      if (typeof wxCharts !== 'function') {
        throw new Error('wxCharts未正确加载或不是构造函数类型');
      }
      
      // 简化时间范围和图表类型处理
      const timeRange = this.data.currentTimeRange || 'week';
      const chartType = this.data.currentChart || 'overall';
      
      // 获取屏幕宽度
      let chartWidth = 300;
      let chartHeight = 200;
      try {
        const res = wx.getSystemInfoSync();
        chartWidth = res.windowWidth - 40; // 减少边距，确保canvas可见
        chartHeight = 200; // 使用更小的高度
      } catch (e) {
        console.error('获取系统信息失败，使用默认尺寸:', e);
      }
      
      // 销毁之前的实例（核心修复：先检查destroy方法是否存在）
      if (this.data.chartInstance) {
        try {
          if (typeof this.data.chartInstance.destroy === 'function') {
            this.data.chartInstance.destroy();
          }
        } catch (destroyError) {
          console.warn('销毁旧图表实例失败:', destroyError);
        }
        this.data.chartInstance = null; // 清空实例引用
      }
      
      // 获取图表数据
      const chartData = this.getChartData(timeRange, chartType);
      
      // 创建图表配置
      const chartConfig = {
        canvasId: 'healthChart',  // 必须与wxml中的canvas-id一致
        type: 'line',
        categories: chartData.categories,
        series: chartData.series,
        width: chartWidth,
        height: chartHeight,
        yAxis: {
          min: 60,  // 扩大最小值范围，适配更多数据
          max: 100, // 使用合理的最大值
          labelFontSize: 12,
          gridColor: '#e5e5e5'
        },
        xAxis: {
          labelFontSize: 12,
          gridColor: '#e5e5e5'
        },
        legend: chartType === 'detailed', // 详细图表显示图例
        animation: true,
        background: '#ffffff'
      };
      
      // 创建图表实例
      this.data.chartInstance = new wxCharts(chartConfig);
      
    } catch (createError) {
      console.error('创建图表实例异常:', createError);
      console.error('错误类型:', createError.name);
      console.error('错误信息:', createError.message);
      console.error('错误堆栈:', createError.stack);
      
      // 显示详细的错误信息
      wx.showModal({
        title: '图表加载失败',
        content: '错误: ' + createError.message + '\n请检查控制台获取更多信息。',
        showCancel: false
      });
    } finally {
      // 更新加载状态
      this.setData({ chartLoading: false });
    }
  },

  // 获取图表数据
  getChartData: function(timeRange, chartType) {
    try {
      // 根据时间范围和图表类型返回对应的数据
      const timeRanges = {
        week: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
        month: ['第1周', '第2周', '第3周', '第4周'],
        year: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
      };
      
      // 确保时间范围有效
      const validTimeRange = timeRange && timeRanges[timeRange] ? timeRange : 'week';
      
      let categories = timeRanges[validTimeRange];
      let series = [];
      
      if (chartType === 'overall') {
        // 整体趋势图表数据
        let data;
        
        if (validTimeRange === 'week') {
          data = [78, 82, 80, 83, 84, 85, 85];
        } else if (validTimeRange === 'month') {
          data = [76, 79, 81, 82];
        } else { // year
          data = [65, 68, 70, 72, 74, 76, 77, 78, 78, 78, 78, 78];
        }
        
        series = [{
          name: '健康评分',
          data: data,
          color: '#3498db',
          format: function(val) {
            return val + '分';
          }
        }];
      } else { // detailed
        // 详细指标图表数据
        let brushingData, gumData, phData;
        
        if (validTimeRange === 'week') {
          brushingData = [75, 80, 78, 82, 85, 88, 90];
          gumData = [85, 86, 87, 88, 89, 91, 92];
          phData = [70, 72, 68, 70, 71, 69, 68];
        } else if (validTimeRange === 'month') {
          brushingData = [72, 76, 80, 85];
          gumData = [82, 85, 88, 92];
          phData = [68, 70, 69, 68];
        } else { // year
          // 对于年度视图，使用季度数据
          categories = ['Q1', 'Q2', 'Q3', 'Q4'];
          brushingData = [65, 70, 75, 85];
          gumData = [70, 75, 80, 92];
          phData = [65, 67, 68, 68];
        }
        
        series = [
          {
            name: '刷牙频率',
            data: brushingData,
            color: '#3498db'
          },
          {
            name: '牙龈健康',
            data: gumData,
            color: '#2ecc71'
          },
          {
            name: '口腔pH值',
            data: phData,
            color: '#f39c12'
          }
        ];
      }
      
      // 构建最终数据对象
      const chartData = {
        categories: categories,
        series: series
      };
      
      // 验证数据完整性
      if (!chartData.categories || chartData.categories.length === 0) {
        throw new Error('无效的categories数据');
      }
      if (!chartData.series || chartData.series.length === 0) {
        throw new Error('无效的series数据');
      }
      
      return chartData;
    } catch (error) {
      console.error('获取图表数据时出错:', error);
      // 返回默认数据作为后备
      return {
        categories: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
        series: [{
          name: '健康评分',
          data: [80, 82, 84, 83, 85, 86, 87],
          color: '#3498db',
          format: function(val) {
            return val + '分';
          }
        }]
      };
    }
  },

  // 处理图表点击事件
  onChartTouch: function(e) {
    if (this.data.chartInstance && !this.data.chartLoading) {
      try {
        const touchData = this.data.chartInstance.getCurrentDataIndex(e);
        if (touchData && touchData.index !== -1) {
          const { currentChart, currentTimeRange } = this.data;
          const chartData = this.getChartData(currentTimeRange, currentChart);
          
          // 获取点击的数据点信息
          const category = chartData.categories[touchData.index];
          let valueInfo = '';
          
          if (currentChart === 'overall') {
            const value = chartData.series[0].data[touchData.index];
            valueInfo = `${category}: ${value}分`;
          } else {
            const seriesIndex = touchData.seriesIndex || 0;
            const seriesName = chartData.series[seriesIndex].name;
            const value = chartData.series[seriesIndex].data[touchData.index];
            valueInfo = `${category}: ${seriesName} ${value}分`;
          }
          
          // 显示点击的数据信息
          wx.showToast({
            title: valueInfo,
            icon: 'none',
            duration: 1500
          });
        }
      } catch (error) {
        console.error('处理图表点击事件失败:', error);
      }
    }
  },

  // 页面显示时执行
  onShow: function() {
    try {
      // 检查页面数据是否已初始化
      if (!this.data.currentTimeRange) {
        this.setData({
          currentTimeRange: 'week',
          currentChart: 'overall',
          chartInstance: null,
          chartLoading: false
        });
      }
      
      // 延迟渲染图表，确保canvas元素完全加载
      setTimeout(() => {
        this.renderChart();
      }, 500);
    } catch (error) {
      console.error('onShow方法执行出错:', error);
    }
  },

  // 页面卸载时清理图表实例（核心修复：安全检查）
  onUnload: function() {
    if (this.data.chartInstance) {
      try {
        // 先检查destroy方法是否存在，再执行
        if (typeof this.data.chartInstance.destroy === 'function') {
          this.data.chartInstance.destroy();
        }
      } catch (error) {
        console.warn('卸载时销毁图表实例失败:', error);
      }
      this.data.chartInstance = null; // 清空引用，避免内存泄漏
    }
  },

  // 下拉刷新
  onPullDownRefresh: function() {
    try {
      // 重新初始化数据
      this.initData();
      // 重新渲染图表
      this.renderChart();
      // 更新健康评分
      this.updateHealthScore(this.data.currentTimeRange);
      // 停止下拉刷新
      wx.stopPullDownRefresh();
      wx.showToast({ title: '数据已刷新', icon: 'success' });
    } catch (error) {
      console.error('下拉刷新失败:', error);
      wx.stopPullDownRefresh();
      wx.showToast({ title: '刷新失败', icon: 'none' });
    }
  }
});